package Motor;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;


import Motor.excepciones.ENoExisteObjeto;
import UTILIDADES.Categoria;
import UTILIDADES.ListaGeneral;
import UTILIDADES.Par;

import CUENTA.Banco;
import CUENTA.Cuenta;
import CUENTA.Movimiento;
import CUENTA.Tarjeta;
import DATA.SaveLoad;

public class Modelo {
	
	private ListaGeneral<Banco> 		_bancos;
	private ListaGeneral<Par> 	        _par;
	private ListaGeneral<Tarjeta> 	    _tarjetas;
	private ListaGeneral<Cuenta>        _cuentas;
	private ListaGeneral<Par>           _parmes;
	private Cuenta                      _efectivo;
	private SaveLoad                    _saveload;
	private String _route;
	
	
	public Modelo(String route){
		_route=route;
		_bancos = new ListaGeneral<Banco>();

		_tarjetas = new ListaGeneral<Tarjeta>();
		_cuentas = new ListaGeneral<Cuenta>();
	}
	
	
	//GETERS
	public String[][] getCategorias(){
		return Categoria.getNombres();
	}
	public Banco[] getBancos(){
		
		return _bancos.list();
	}//devuelve lista de bancos
	
	public int getEfectivo(){ 
		return _efectivo.get_cantidad();
	}//devuelvel cantidad efectivo(dentro de cuenta)FALTA POR HACER!!!!!
	
	public Tarjeta[] getTarjetas(){
		_tarjetas = new ListaGeneral<Tarjeta>();
		Iterator<Cuenta> i = _cuentas.get_lista().iterator();
		
		while(i.hasNext())
		{
			Iterator<Tarjeta> j = i.next().get_tarjetas().get_lista().iterator();
			while(j.hasNext())
			{
				_tarjetas.add(j.next());
			}
		}
		
		return _tarjetas.list();
		
	}//devuelve tarjeta
	
	public ArrayList<Cuenta> getCuentas(){
		return _cuentas.get_lista();
	}//devuelve tarjeta
	
	public ArrayList<Par> getMovimientosTodos(){
		_par = new ListaGeneral<Par>();
		Iterator<Cuenta> i = _cuentas.get_lista().iterator();
		
		while(i.hasNext())
		{
			Cuenta auxiliar = i.next();
			Iterator<Movimiento> j = auxiliar.get_movimientos().get_lista().iterator();
			while(j.hasNext())
			{
				Par auxpar = new Par();
				auxpar.mov = j.next();
				auxpar.cuenta = auxiliar.get_numeroCuenta();
				_par.add(auxpar);
			}
		}
		
		return _par.get_lista();
	}//devuelve movimientos
	
	public ArrayList<Par> getMovimientosMes(){
		getMovimientosTodos();
		Date date = new Date(System.currentTimeMillis());
		Calendar cal = Calendar.getInstance();
		Iterator<Par> i = _par.get_lista().iterator();
		cal.setTime(date);
        _parmes = new ListaGeneral<Par>();
        int mes = cal.get(Calendar.MONTH);
        if (i.hasNext())
        {
	        Par auxiliar = i.next();
	        boolean salir = false;
	        while(cal.get(Calendar.MONTH) == mes && salir == false)
			{
	           	cal.setTime(auxiliar.mov.get_cuando());
	           	_parmes.add(auxiliar);
	        	if(i.hasNext())
	        		auxiliar = i.next();
	        	else
	        		salir=true;
	        	
			}
        }
		
		return _parmes.get_lista();
	}
	
	public void add(Movimiento movimiento, String nombrecuenta)
	{
		Iterator<Cuenta> i = _cuentas.get_lista().iterator();
		Cuenta cuenta = null;
		Cuenta cuentaAux ;
		while(i.hasNext())
		{
			cuentaAux = i.next();
			if(cuentaAux.get_numeroCuenta().equals(nombrecuenta))
			{
				cuenta = cuentaAux;
			}
		}
		//_cuentas.getobjeto(cuenta).get_movimientos().add(movimiento);
		Cuenta c=_cuentas.getobjeto(cuenta);
		ListaGeneral<Movimiento> m=c.get_movimientos();
		m.add(movimiento);
		c.set_movimientos(m);
		c.set_cantidad(movimiento.get_cantidad());
		_cuentas.edit(c, cuenta);
		
		
		
	}
	public void add(Cuenta cuenta){
		_cuentas.add(cuenta);
	}

	public void add(Tarjeta tarjeta, String nombrecuenta){
		Iterator<Cuenta> i = _cuentas.get_lista().iterator();
		Cuenta cuenta = null;
		Cuenta cuentaAux ;
		while(i.hasNext())
		{
			cuentaAux = i.next();
			if(cuentaAux.get_numeroCuenta().equals(nombrecuenta))
			{
				cuenta = cuentaAux;
			}
		}
		_cuentas.getobjeto(cuenta).get_tarjetas().add(tarjeta);
	}	
	
	public void add(Banco banco){
		_bancos.add(banco);
	}
	
	//deletes

	
	public void delete(Cuenta cuenta)	{
		_cuentas.delete(cuenta);
	}
	
	public void delete(Tarjeta tarjeta, String nombrecuenta){
		Iterator<Cuenta> i = _cuentas.get_lista().iterator();
		Cuenta cuenta = null;
		Cuenta cuentaAux ;
		while(i.hasNext())
		{
			cuentaAux = i.next();
			if(cuentaAux.get_numeroCuenta().equals(nombrecuenta))
			{
				cuenta = cuentaAux;
			}
		}
		_cuentas.getobjeto(cuenta).get_tarjetas().delete(tarjeta);
	}	
//transferencia a cuenta
//ingresar efectivo
	public void modificarEfectivo(int cantidad){
		_efectivo.set_cantidad(_efectivo.get_cantidad()+cantidad);
	}
	
	public void hacerTransferencia(String transferidor, String transferido, int transferir) throws ENoExisteObjeto{
		Iterator<Cuenta> i = _cuentas.get_lista().iterator();
		Cuenta cuenta = null;
		Cuenta cuentaAux ;
		Cuenta cuenta2 = null;
		while(i.hasNext())
		{
			cuentaAux = i.next();
			if(cuentaAux.get_numeroCuenta().equals(transferidor))
			{
				cuenta = cuentaAux;
			}
			if(cuentaAux.get_numeroCuenta().equals(transferido))
			{
				cuenta2 = cuentaAux;
			}
		}
		if ((cuenta.get_cantidad() > 0) && (cuenta.get_cantidad() >= transferir) && (cuenta != null) && (cuenta2 != null))
		{
			cuenta.set_cantidad(cuenta.get_cantidad()-transferir);
			
			cuenta2.set_cantidad(cuenta2.get_cantidad()+transferir);
		}
		else throw new ENoExisteObjeto();
	}
	//edits
	public void edit(Cuenta sustituto, Cuenta sustituido){
		_cuentas.edit(sustituto, sustituido);
	}//APUNTADA PARA LUEGO
	
	public void edit(Tarjeta sustituto, Tarjeta sustituido){
		_tarjetas.edit(sustituto, sustituido);
	}	
//apuntada para luego
	
	
	//metaDatos
	public void Save(){
		_saveload = new SaveLoad( _bancos, _cuentas,_route);
	}//llamar a saveload
	
	public void Load(){
		_saveload = new SaveLoad(_route);
		_bancos = _saveload.getListaBanco();
		_cuentas = _saveload.getListaCuenta();			
	}//LLamar a saveload
	
}
